﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


/// <summary>
/// 工厂方法模式
/// </summary>
namespace FM
{
    //案例
    //业务背景: 你正在开发一个跨平台的应用程序。每个平台（或用户选择的主题）都需要一套不同风格的 UI 控件，比如按钮、输入框、下拉框等。

    //使用场景一：工厂方法模式
    //如果你只需要根据不同平台创建一种控件（比如某一个按钮），就可以用工厂方法模式。


    // 抽象产品
    public interface IButton
    {
        void Render();      
    }

    // 具体产品
    public class WindowsButton : IButton
    {
        public void Render() => Console.WriteLine("Rendering a Windows style button.");
    }

    public class MacButton : IButton
    {
        public void Render() => Console.WriteLine("Rendering a Mac style button.");
    }

    /// <summary>
    /// 抽象工厂类
    /// </summary>
    public abstract class AbstractButtonFactory
    {
        public abstract IButton CreateButton();
    }

    // 具体工厂
    // 重写具体的实现方法,并返回
    public class WindowsButtonFactory : AbstractButtonFactory
    {
        public override IButton CreateButton() => new WindowsButton();
    }

    // 具体工厂
    public class MacButtonFactory : AbstractButtonFactory
    {
        public override IButton CreateButton() => new MacButton();
    }


    /// <summary>
    /// 主程序
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {

            func1();
            func2();
            Console.WriteLine();
            Console.ReadKey();
        }

        static public void func1()
        {
            AbstractButtonFactory factory = new WindowsButtonFactory(); // or MacButtonFactory
            IButton button = factory.CreateButton();
            button.Render();
        }

        static public void func2()
        {
            AbstractButtonFactory factory = new MacButtonFactory(); // or MacButtonFactory
            IButton button = factory.CreateButton();
            button.Render();
        }

    }
}
